package com.dp.server;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.dp.client.dto.ClienteBusqueda;
import com.dp.client.dto.ClienteDTO;
import com.dp.client.dto.PerfilDTO;
import com.dp.client.servicios.clientes.IServiciosCliente;
import com.dp.server.entities.Cliente;
import com.dp.server.entities.Perfil;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class IServiciosClienteImpl  extends RemoteServiceServlet implements IServiciosCliente{
	IServiciosIncidenciaImpl incidente = new IServiciosIncidenciaImpl();
	MantenimientoGenerico< Cliente > mantenimientoGenerico= new MantenimientoGenerico("Cliente");
	@Override 
	public boolean registrarCliente(ClienteDTO clienteDTO) {
		Cliente cliente = new Cliente(clienteDTO);
		// saving the data on DB
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		Cliente nuevo=entityManager.merge(cliente);
		entityManager.getTransaction().commit();
		entityManager.close();
		String tipo="registrado un nuevo";
		if (clienteDTO.getId() != 0 )
			tipo="modificado el";
		String msg="Se ha "+tipo+" cliente "+nuevo.getNombre()+" "+nuevo.getApellido1()+" "+nuevo.getApellido2()+". ";
		incidente.Registrar(msg, "cliente", nuevo.getId());
		return true;
	}
	
	public List<ClienteDTO> listClientes(){
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		List<Cliente> lista = entityManager.createQuery("from Cliente").getResultList();
		entityManager.close();
		ArrayList<ClienteDTO> result = new ArrayList<ClienteDTO>();
		for(Cliente c : lista){
			result.add(new ClienteDTO(c.getId(), c.getNombre(), c.getApellido1(), c.getApellido2(), 
					c.getCorreo(), 0 /* envios */, c.getFechaRegistro(), c.getPassword(), c.getUsuario(), buscarPerfil(c.getPerfilId())));
		}
		return result;
	}

	@Override
	public boolean eliminarCliente(int clienteID) {
		Cliente eliminado=mantenimientoGenerico.buscarID(clienteID);
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		entityManager.createQuery("delete from Cliente where id = " + clienteID).executeUpdate();
		entityManager.getTransaction().commit();
		entityManager.close();
		String msg="Se ha eliminado un  cliente "+eliminado.getNombre()+" "+eliminado.getApellido1()+" "+eliminado.getApellido2()+". ";
		incidente.Registrar(msg, "cliente", eliminado.getId());
		return true;
	}

	@Override
	public List<ClienteDTO> buscarClientes(ClienteBusqueda clienteBusqueda) {
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		
		String query = "from Cliente where ";
		query += " apellido1 like '%" + clienteBusqueda.getApellido1() + "%' ";
		query += " and apellido2 like '%" + clienteBusqueda.getApellido2() + "%' ";
		query += " and nombre like '%" + clienteBusqueda.getNombre() + "%' ";
		if(clienteBusqueda.getCodigo().matches("\\d+"))
			query += "and id = " + clienteBusqueda.getCodigo();
			
		
		List<Cliente> lista = entityManager.createQuery(query).getResultList();
		entityManager.close();
		ArrayList<ClienteDTO> result = new ArrayList<ClienteDTO>();
		for(Cliente c : lista){
			result.add(new ClienteDTO(c.getId(), c.getNombre(), c.getApellido1(), c.getApellido2(), 
					c.getCorreo(), 0 /* envios */, c.getFechaRegistro(), c.getPassword(), c.getUsuario(), buscarPerfil(c.getPerfilId())));
		}
		return result;
	}
	
	public PerfilDTO buscarPerfil(int perfilID){
		if(perfilID == 0) return new PerfilDTO();
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		Perfil perfil = (Perfil)entityManager.createQuery("from Perfil where id = " + perfilID).getResultList().get(0);
		entityManager.getTransaction().commit();
		entityManager.close();
		return new PerfilDTO(perfil.getId(), perfil.getPuedeClientes(), perfil.getPuedeAlmacenes(), perfil.getPuedeConexiones(), perfil.getPuedePaquetes(), perfil.getPuedeSimulacion());
	}
	
	public Cliente buscarCliente(int clienteID) {
		//EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");
		EntityManagerFactory entityManagerFactory=MantenimientoGenerico.entityManagerFactory;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		List<Cliente> c = entityManager.createQuery("from Cliente where id = " + clienteID).getResultList();
		entityManager.getTransaction().commit();
		entityManager.close();
		String nombre =c.get(0).getNombre()+" "+c.get(0).getApellido1()+" "+c.get(0).getApellido2();
		System.out.println(nombre);
		return c.get(0);
	}

}
